JUnit中测试异常抛出的方法 您所在的位置:网站首页 mock interface方法 JUnit中测试异常抛出的方法

JUnit中测试异常抛出的方法

#JUnit中测试异常抛出的方法| 来源: 网络整理| 查看: 265

最近在做TWU关于TDD的作业,对JUnit中测试异常抛出的方法进行了一些学习和思考。

在进行单元测试的时候有的时候需要测试某一方法是否抛出了正确的异常。例如,我有一个方法,里面对一个List进行读取操作,可能会抛出IndexOutOfBoundsException,我希望在单元测试中通过测试保证该方法会正确的抛出正确类型的异常。总结起来这样的测试异常是否被正确抛出

校验方式有三种:

1. try…fail…catch…

@Test public voidtestExceptionMessage() { try { new ArrayList().get(0); fail("Expected an IndexOutOfBoundsException to be thrown"); } catch (IndexOutOfBoundsException anIndexOutOfBoundsException) { assertThat(anIndexOutOfBoundsException.getMessage(), is("Index: 0, Size: 0")); } }

这种写法看上去和实现类的写法很相似,当没有异常被抛出的时候fail方法会被调用,输出测试失败的信息。

2.@Test(expected=xxx)

@Test(expected= IndexOutOfBoundsException.class) public void empty() { new ArrayList().get(0); }

这种写法看上去简单了一些,但是它有一个潜在的问题:当被标记的这个测试方法中的任何一个操作抛出了相应的异常时,这个测试就会通过。这就意味着有可能抛出异常的地方并不是我们期望的那个操作。虽然这种情况可以在写test case的时候人为的避免,但是还是有更好的方法来测试异常抛出。

3.ExpectedException Rule

@Rule public ExpectedException thrown = ExpectedException.none(); @Test public void shouldTestExceptionMessage() throws IndexOutOfBoundsException { List list = new ArrayList(); thrown.expect(IndexOutOfBoundsException.class); thrown.expectMessage("Index: 0, Size: 0"); list.get(0); // execution will never get past this line }

这种方法除了可以指定期望抛出的异常类型之外还可以指定在抛出异常时希望同时给出的异常信息。它需要在测试之前使用Rule标记来指定一个ExpectedException,并在测试相应操作之前指定期望的Exception类型(如IndexOutOfBoundException.class)

这三种方法都可以做到测试相应的操作是否抛出了期望的异常,但是哪种方法更好更适合使用呢?

我的总结是:

try…fail…catch > ExpectedException > @Test(expected=xxx)

我之所以认为try…fail…catch方法比ExpectedException好是因为:

try…fail…catch更符合一般的test function的风格,先进行某项操作,在对结果进行assert。而ExpectedException的顺序确实先指明期待的结果再进行相应的操作。

虽然TDD的最佳实践是每个test function只有一个assert,但是还是在有些情况下会在同一个test function里使用多个assert来对不同的方面进行测试。但是使用ExpectedException进行异常测试后,当前的test function就结束了,如果在expect的相应操作之后还有assert的话会被自动跳过,而try…fail…catch则不会跳出当前test function, 其后面的assert依然会被顺序执行。

ExpectedException是JUnit提供的,因此在使用别的测试框架时这样的测试方法无效。而try/catch有更多的测试框架支持(fail也是JUnit提供的。使用别的测试框架的时候不能使用fail来给出测试失败的信息)

-----以下是我自己的看法: try…fail…catch 这种写法,比较容易忽略catch前面的fail(),且不容易检查, 一般我们看到try…catch会认为是对抛出的异常做处理,但在这里是在验证,阅读代码时不流畅,且容易让其他人有误解 个人比较喜欢ExpectedException的方式

但是在实际使用过程中,如果需要有其他的断言或者mock的verify的判断,使用 try…fail…catch的写法可以比较好的覆盖,否则后面的断言和verify就无法执行了。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有